package jwt

import (
	"fmt"
	"github.com/golang-jwt/jwt/v5"
	"time"
)

// 定义密钥
var MySigningKey = []byte("my-secret-key")

type User struct {
	Id       string `json:"id"`
	UserName string `json:"userName"`
}

// 自定义 Claims 结构体
type MyCustomClaims struct {
	User
	jwt.RegisteredClaims
}

func GenerateToken(user *User) (string, error) {
	// 创建 Claims
	claims := MyCustomClaims{
		User: *user,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间
			IssuedAt:  jwt.NewNumericDate(time.Now()),                     // 签发时间
			Issuer:    user.UserName,                                      // 签发者
		},
	}

	// 创建 Token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// 签名并生成完整 Token
	tokenString, err := token.SignedString(MySigningKey)
	if err != nil {
		return "", err
	}

	return tokenString, nil
}

func ValidateToken(tokenString string) (*jwt.Token, error) {
	// 解析 Token
	token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		// 返回密钥
		return MySigningKey, nil
	})
	if err != nil {
		return nil, err
	}
	return token, nil
}
